package springx;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.querys.MySqlQuery;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;
import com.baomidou.mybatisplus.generator.fill.Property;
import com.baomidou.mybatisplus.generator.keywords.MySqlKeyWordsHandler;

import java.util.Collections;

public class gemerator {
    //定义数据库字段
    private static final String JDBC_URL="jdbc:mysql://47.106.187.116:3306/springsucurity?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
    private static final String JDBC_ROOT="root";
    private static final String JDBC_PASSWORD="Aa574538457!";
    //定义包名和模块名
    private static final String PACKAGE_NAME="springx";
    private static  final String MODULE_NAME="springx";
    //表名,多个表用逗号分割
    private static  final  String[] TBL_NAMES={"t_admin","t_admin_role","t_role"};
    //生成代码时忽略表的前缀
    private  static final  String TABLE_PREFIX="t_";

    public static void main(String[] args) {
        //获取逆向工程路径
        String projectPath = System.getProperty("user.dir");
        DataSourceConfig.Builder dataSourceConfigBuilder = new DataSourceConfig.Builder(JDBC_URL, JDBC_ROOT,
                JDBC_PASSWORD)
                .dbQuery(new MySqlQuery())
                .typeConvert(new MySqlTypeConvert())
                .keyWordsHandler(new MySqlKeyWordsHandler());


        FastAutoGenerator fastAutoGenerator = FastAutoGenerator.create(dataSourceConfigBuilder);

        /**
         // 2.全局配置
         // 覆盖已生成文件
         // 不打开生成文件目录
         // 指定输出目录,注意斜杠的表示
         // 设置注释的作者
         // 设置注释的日期格式
         // 使用java8新的时间类型
         // swagger文档   enableSwagger()
         */
        fastAutoGenerator.globalConfig(
                globalConfigBuilder -> globalConfigBuilder
                        //覆盖生成文件
                        .fileOverride()
                        .disableOpenDir()
                        //指定输出目录
                        .outputDir(projectPath + "/src/main/java")
                        //设置作者
                        .author("夏JCC")
                        //设置日期
                        .commentDate("yyyy-MM-dd HH:mm:ss")
                        //使用新的日期格式.
                        .dateType(DateType.TIME_PACK)
                        //开启swagger注解
                        .enableSwagger()
        );
        /**
         日期类型 DateType
         DateType.ONLY_DATE 使用 java.util.date包下的 Date
         DateType.SQL_PACK 使用 java.sql包下的 Date
         DateType.TIME_PACK   因为会使用 java.time.LocalDateTime jdk1.8以上才支持  (推荐使用)
         */


        /**
         // 3.包配置
         // 设置父包名
         // 设置父包模块名
         // 设置MVC下各个模块的包名
         // 设置XML资源文件的目录
         */
        fastAutoGenerator.packageConfig(
                packageConfigBuilder -> packageConfigBuilder
                        //设置父包名
                        .parent(PACKAGE_NAME)
//                        .moduleName(MODULE_NAME)
                        //以下是配置各个包名
                        .entity("pojo")
                        .mapper("mapper")
                        //根据需要来构筑xml
                        .xml("mapper.xml")
                        .service("service")
                        .serviceImpl("service.impl")
                        .controller("controller")
        );

        /**
         // 4.模板配置
         // 默认的是Velocity引擎模板,这里我们就不需要操作了
         */


        /**
         // 5.注入配置 TODO
         */


        /**
         // 6.策略配置

        // 设置需要生成的表名
        // 设置过滤表前缀
         */
        fastAutoGenerator.strategyConfig(
                strategyConfigBuilder -> strategyConfigBuilder
                        //开启大写命名
                        .enableCapitalMode()
                        //开启跳过视图
                        .enableSkipView()
                        //禁用sql过滤
                        .disableSqlFilter()
                        //添加需要生成的表名
                        .addInclude(TBL_NAMES)
                        //忽略表前缀
                        .addTablePrefix(TABLE_PREFIX)
        );

        /**
         // 6.1 Entity策略配置
         // 生成实体时生成字段的注解，包括@TableId注解等---
         // 数据库表和字段映射到实体的命名策略，为下划线转驼峰
         // 全局主键类型为ASSIGN_ID    雪花算法
         // 实体名称格式化为XXXEntity   formatFileName("%sEntity")
         // 支持lombok开启注解
         // 逻辑删除字段名
         // 自动填充配置  create_time  update_time 两种方式
         // 开启乐观锁
         // 禁用生成 serialVersionUID，默认值:true
         */
        fastAutoGenerator.strategyConfig(
                strategyConfigBuilder ->
                        strategyConfigBuilder.entityBuilder()
                                //实体类的策略配置
                                //开启实体类字段注解
                                .enableTableFieldAnnotation()
                                //数据库表和字段映射的时候，下划线转驼峰
                                .naming(NamingStrategy.underline_to_camel)
                                .columnNaming(NamingStrategy.underline_to_camel)
                                //全局的主键类型是ASSIGN_ID
                                .idType(IdType.AUTO)
                                //开启lombok
                                .enableLombok()
                                //逻辑删除的字段名
                                .logicDeleteColumnName("deleted")
                                .logicDeletePropertyName("deleted")
                                //自动填充配置，创建时间，更新时间
                                .addTableFills(new Column("create_time", FieldFill.INSERT))
                                .addTableFills(new Property("updateTime",FieldFill.INSERT_UPDATE))
                                //开启乐观锁
                                .versionColumnName("version")
                                .disableSerialVersionUID()
        );

        /**
         // 6.2 Controller策略配置
         // 开启生成@RestController控制器
         // 开启请求风格  localhost:8080/hello_id_2
         */
        //开启Controller策略配置
        fastAutoGenerator
                .strategyConfig(strategyConfigBuilder ->
                        strategyConfigBuilder
                                //开启@RestController控制器
                                .controllerBuilder()
                                //开启请求rest风格
                                .enableRestStyle()
                                .enableHyphenStyle()
                );

        /**
         // 6.3.Service策略配置
         // 格式化service接口和实现类的文件名称，去掉默认的ServiceName前面的I ----
         */
        //service策略配置
        fastAutoGenerator.strategyConfig(
                strategyConfigBuilder -> strategyConfigBuilder
                        .serviceBuilder()
                        //格式化文件名称，没什么可注意的，开启即可
                        .formatServiceFileName("%sService")
                        .formatServiceImplFileName("%sServiceImpl"));

        /**
         // 6.4.Mapper策略配置
         // 格式化 mapper文件名,格式化xml实现类文件名称
         //.enableBaseColumnList()
         //.superClass(BaseMapper.class)
         //.enableMapperAnnotation()
         */
        //注意Mapper策略配置
        fastAutoGenerator.strategyConfig(
                strategyConfigBuilder ->
                        strategyConfigBuilder.mapperBuilder()
                                //开启resultMap，很重要
                                .enableBaseResultMap()
                                .enableBaseColumnList()
                                .superClass(BaseMapper.class)
                                .enableMapperAnnotation()
                                //生成Mapper包名
                                .formatMapperFileName("%sMapper")
                                .formatXmlFileName("%sMapper"));

        /** 7.生成代码
         *
         */
        fastAutoGenerator.execute();

    }
}
 /*全局配置(GlobalConfig)
                fileOverride	覆盖已生成文件	默认值:false
                disableOpenDir	禁止打开输出目录	默认值:true
                outputDir(String)	指定输出目录	/opt/baomidou/ 默认值: windows:D:// linux or mac : /tmp
                author(String)	作者名	baomidou 默认值:作者
                enableKotlin	开启 kotlin 模式	默认值:false
                enableSwagger	开启 swagger 模式	默认值:false
                dateType(DateType)	时间策略	DateType.ONLY_DATE 默认值: DateType.TIME_PACK
                commentDate(String)	注释日期	默认值: yyyy-MM-dd*/
/*包配置(PackageConfig)
                方法	说明	示例
                parent(String)	父包名	默认值:com.baomidou
                moduleName(String)	父包模块名	默认值:无
                entity(String)	Entity 包名	默认值:entity
                service(String)	Service 包名	默认值:service
                serviceImpl(String)	Service Impl 包名	默认值:service.impl
                mapper(String)	Mapper 包名	默认值:mapper
                xml(String)	Mapper XML 包名	默认值:mapper.xml
                controller(String)	Controller 包名	默认值:controller
                other(String)	自定义文件包名	输出自定义文件时所用到的包名
                pathInfo(Map<OutputFile, String>)	路径配置信息	Collections.singletonMap(OutputFile.mapperXml, "D://")*/
  /*策略配置(StrategyConfig)
                方法	说明	示例
                enableCapitalMode	开启大写命名	默认值:false
                enableSkipView	开启跳过视图	默认值:false
                disableSqlFilter	禁用 sql 过滤	默认值:true，语法不能支持使用 sql 过滤表的话，可以考虑关闭此开关
                enableSchema	启用 schema	默认值:false，多 schema 场景的时候打开
                likeTable(LikeTable)	模糊表匹配(sql 过滤)	likeTable 与 notLikeTable 只能配置一项
                notLikeTable(LikeTable)	模糊表排除(sql 过滤)	likeTable 与 notLikeTable 只能配置一项
                addInclude(String...)	增加表匹配(内存过滤)	include 与 exclude 只能配置一项
                addExclude(String...)	增加表排除匹配(内存过滤)	include 与 exclude 只能配置一项
                addTablePrefix(String...)	增加过滤表前缀
                addTableSuffix(String...)	增加过滤表后缀
                addFieldPrefix(String...)	增加过滤字段前缀
                addFieldSuffix(String...)	增加过滤字段后缀
                entityBuilder	实体策略配置
                controllerBuilder	controller 策略配置
                mapperBuilder	mapper 策略配置
                serviceBuilder	service 策略配置*/
 /*模板配置(TemplateConfig)
                方法	说明	示例
                disable	禁用所有模板
                disable(TemplateType...)	禁用模板	TemplateType.ENTITY
                entity(String)	设置实体模板路径(JAVA)	/templates/entity.java
                entityKt(String)	设置实体模板路径(kotlin)	/templates/entity.java
                service(String)	设置 service 模板路径	/templates/service.java
                serviceImpl(String)	设置 serviceImpl 模板路径	/templates/serviceImpl.java
                mapper(String)	设置 mapper 模板路径	/templates/mapper.java
                mapperXml(String)	设置 mapperXml 模板路径	/templates/mapper.xml
                controller(String)	设置 controller 模板路径	/templates/controller.java*/
